#include "../include/head.h"
int curman;

void manage_stu(void)
{
    Pnode_list HSTU=creat_list();
    Pnode_list read_HSTU=creat_list();
    read_file(read_HSTU);
    system("clear");
    Pnode_list p;
    int choice;
    while (1)
    {
        
        menu_stu();
        scanf("%d",&choice);
        getchar();
       
        switch (choice)
        {
        case 1:
            system("clear");
            inputdata(HSTU);
            break;
        case 2:
            system("clear");
            printf("输出全部学生信息\n");
            sort_students(read_HSTU);
            p=read_HSTU->next;
            printf("\n%-13s%-13s%-13s%-10s%-10s%-10s%-10s%-10s%-10s\n", 
           "姓名", "班级", "学号", "语文", "数学", "英语", "物理", "化学","生物");
            printf("--------------------------------------------------------------------------------\n");
    
            while (p != read_HSTU) {    
                printf("%-12s%-12s%-12s%-8.2lf%-8.2lf%-8.2lf%-8.2lf%-8.2lf%-8.2lf\n", 
               p->info.name, p->info.class, p->info.id,
               p->info.score[0], p->info.score[1],
               p->info.score[2], p->info.score[3],
               p->info.score[4],p->info.score[5]);
                p=p->next;
            
            }
            
            break;
        case 3:
            system("clear");
            find_data_file(read_HSTU);
            
            break;
        case 4:
            system("clear");
            change_data_file(read_HSTU);
            
            break;
        case 5:
            system("clear");
             delete_student(read_HSTU);
             
            break;
        case 6:
             return ;
             
            break;
        default:
            break;
        }
    }
}
 


void write_file(Pnode_list head)
{
    printf("写入文件\n");
    FILE *fp=fopen("./student_management/data/stu.txt","w");
    if(fp==NULL){ printf("文件打卡失败\n");return;}

    Pnode_list p=head->next;//头节点不存数据

    while(p!=head)
    { printf("开始写入\n");
        fwrite(&p->info,sizeof(Data_type),1,fp);
        p=p->next;
    }
    fclose(fp);
    printf("文件写入完成\n");

}

void read_file(Pnode_list head)
{
    FILE *fp=fopen("./student_management/data/stu.txt","r");
    if(fp==NULL)
    {
        printf("读取文件打开失败\n");
        curman=0;
        return;
    }
    clear_list(head);
    curman=0;
    Data_type stu;
    while (fread(&stu, sizeof(Data_type), 1, fp) == 1) 
    { 
        tail_insert(head, stu);
        curman++;
    }
    printf("curman:%d\n",curman);
    fclose(fp);
}

//菜单
void menu_stu(void)
{
    char m[6][100]={"1.录入学生信息","2.查询信息","3.查询学生信息","4.修改学生信息","5.删除学生信息","6.退出"};
    printf("\n----------------------------\n学生管理\n------------------------\n");
    for (int i=0;i<6;i++)
    printf("%s\n",m[i]);
    printf("----------------------------\n");
}

//输入入学生信息
void inputdata(Pnode_list head)
{
    Data_type stu;
    //1.输入
    printf("学号 姓名 班级");
    scanf("%19s",stu.id);
    getchar();
    scanf("%19s",stu.name);
    getchar();
    scanf("%19s",stu.class);
    getchar();
    printf("请输入六科成绩：");
        for(int j=0;j<6;j++)
        {
            scanf("%lf",&stu.score[j]);
            getchar();
        }
        curman++;
    //2.将信息加在链表的表尾
    tail_insert(head,stu);
  
    //3.写入文件
    write_file(head);

}

//查找
Data_type FindputData1(Pnode_list head, int field, char *keyword) {
    Data_type temp = {0};
    Pnode_list p = head->next;
    
    while (p != head) {
        // 根据 field 参数选择比较的字段
        int match = 0;
        switch (field) {
            case 1: // 学号
                match = strcmp(p->info.id, keyword) == 0;
                break;
            case 2: // 姓名
                match = strcmp(p->info.name, keyword) == 0;
                break;
            case 3: // 班级
                match = strcmp(p->info.class, keyword) == 0;
                break;
            default:
                return temp; // 无效字段，直接返回
        }
        
        if (match) {
            temp = p->info;
            break;
        }
        p = p->next;
    }
    
    return temp;
}


// Data_type FindputData1(Pnode_list head,char *find)
// {
//     Data_type temp={0};
//     Pnode_list p=head->next;
//     for(int i=0;i<curman;i++)
//     {
//         if(strcmp(p->info.name,find)==0)
//         {
//             temp=p->info;
//             break;
//         }
//         p=p->next;
//     }
//     return temp;
// }


//从文件查找学生信息
void find_data_file(Pnode_list head)
{
    printf("\n请选择要查询的字段：\n");
    printf("1. 学号\n2. 姓名\n3. 班级\n");
    printf("输入选项（1-3）：");

    int choice;
    if (scanf("%d", &choice) != 1 || choice < 1 || choice > 3) {
        printf("无效选项！\n");
        return;
    }
    getchar(); // 清空输入缓冲区

    char keyword[20];
    switch (choice) {
        case 1: // 学号
            printf("请输入要查询的学号：");
            if (scanf("%19s", keyword) != 1) {
                printf("输入格式错误！\n");
                getchar();
                return;
            }
            getchar();
            break;
        case 2: // 姓名
            printf("请输入要查询的姓名：");
            if (scanf("%19s", keyword) != 1) {
                printf("输入格式错误！\n");
                getchar();
                return;
            }
            getchar();
            break;
        case 3: // 班级
            printf("请输入要查询的班级：");
            if (scanf("%19s", keyword) != 1) {
                printf("输入格式错误！\n");
                getchar();
                return;
            }
            getchar();
            break;
        default:
            printf("无效选项！\n");
            return;
    }

    read_file(head);
    Data_type find_data = FindputData1(head,choice, keyword);
    if (strlen(find_data.id) != 0) {
        printf("学生信息：姓名%s\t班级%s\t学号%s\t", find_data.name, find_data.class, find_data.id);
        printf("学生成绩： %.2lf %.2lf  %.2lf %.2lf %.2lf %.2lf\n",
               find_data.score[0], find_data.score[1], find_data.score[2],
               find_data.score[3], find_data.score[4], find_data.score[5]);
    } else {
        printf("查无此人\n");
    }
}

// 删除学生信息
void delete_student(Pnode_list head) {
    char id[20];
    printf("输入要删除的学生学号：");
    scanf("%19s", id);
    
    Pnode_list prev = head;
    Pnode_list current = head->next;
    
    while (current) {
        if (strcmp(current->info.id, id) == 0) {
            prev->next = current->next;
            free(current);
            printf("学生信息已删除！\n");
            return;
        }
        prev = current;
        current = current->next;
    }
    
    printf("未找到该学生！\n");
}

// void find_data_file(Pnode_list head)
// {
    
//    printf("\n请选择要查询的字段：\n");
//             printf("1. 学号\n2. 姓名\n3. 班级\n");
//             printf("输入选项（1-3）：");
//             int choice;
//             if (scanf("%d", &choice) != 1 || choice < 1 || choice > 3) {
//                 printf("无效选项！\n");
//                 return;
//             }
//             getchar(); // 清空输入缓冲区

//             // 5. 根据选择修改特定字段
//             switch (choice) {
//                 case 1: // 学号
//                     char find_id[20];
//                     printf("请输入要查询的学号：");
//                     scanf("%19s",find_id);
//                     getchar(); // 清空输入缓冲区
//                     read_file(head);
//                     Data_type  find_data=FindputData1(head,find_id);
//                     if(strlen(find_data.id)!=0)
//                     {
//                     printf("学生信息：姓名%s\t班级%s\t学号%s\t",find_data.name,find_data.class,find_data.id);
//                     printf("学生成绩： %.2lf %.2lf  %.2lf %.2lf %.2lf %.2lf\n",find_data.score[0],find_data.score[1],find_data.score[2],find_data.score[3],find_data.score[4],find_data.score[5]);
//                     }
//                     else
//                     printf("查无此人\n");
//                     break;
//                 case 2: // 姓名
//                     char find_name[20];
//                     printf("请输入要查询的姓名：");
//                     scanf("%19s",find_name);
//                     getchar();
//                     read_file(head);
//                     Data_type  find_data=FindputData1(head,find_name);
//                     if(strlen(find_data.name)!=0){
//                     printf("学生信息：姓名%s\t班级%s\t学号%s\t",find_data.name,find_data.class,find_data.id);
//                     printf("学生成绩： %.2lf %.2lf  %.2lf %.2lf %.2lf %.2lf\n",find_data.score[0],find_data.score[1],find_data.score[2],find_data.score[3],find_data.score[4],find_data.score[5]);
//                     }
//                     else
//                     printf("查无此人\n");
//                     break;
//                 case 3: // 班级
//                     char find_class[20];
//                     printf("请输入要查询的班级：");
//                     scanf("%19s",find_class);
//                     getchar(); // 清空输入缓冲区
//                     read_file(head);
//                     Data_type  find_data=FindputData1(head,find_class);
//                     if(strlen(find_data.class)!=0)
//                     {
//                     printf("学生信息：姓名%s\t班级%s\t学号%s\t",find_data.name,find_data.class,find_data.id);
//                     printf("学生成绩： %.2lf %.2lf  %.2lf %.2lf %.2lf %.2lf\n",find_data.score[0],find_data.score[1],find_data.score[2],find_data.score[3],find_data.score[4],find_data.score[5]);
//                     }
//                     else
//                     printf("查无此人\n");
//                     break;
//                 default: // 修改其他科目成绩
//                     break;
//             }
    
// }


//修改学生信息
void change_data_file(Pnode_list head)
{
   char find_name[20];
    printf("请输入要修改的学生姓名：");
    if (scanf("%19s", find_name) != 1) {
        printf("输入无效！\n");
        while (getchar() != '\n'); // 清空输入缓冲区
        return;
    }
    getchar();

    // 2. 查找学生
    Pnode_list p = head->next;
    while (p != head) {
        if (strcmp(p->info.name, find_name) == 0) {
            // 3. 显示当前信息
            printf("当前学生信息：\n");
            printf("学号：%s\n姓名：%s\n班级：%s\n", p->info.id, p->info.name, p->info.class);
            //printf("学科：语文数学英语物理化学生物")
            printf("成绩：%.2lf\t%.2lf\t%.2lf\t%.2lf\t%2lf\t%.2lf\n",p->info.score[0], p->info.score[1], p->info.score[2], p->info.score[3], p->info.score[4],p->info.score[4]);

            // 4. 选择要修改的字段
            printf("\n请选择要修改的字段：\n");
            printf("1. 学号\n2. 姓名\n3. 班级\n4. 第1科成绩\n5. 第2科成绩\n6. 第3科成绩\n7. 第4科成绩\n8. 第5科成绩\n9. 第6科成绩\n");
            printf("输入选项（1-9）：");
            
            int choice;
            if (scanf("%d", &choice) != 1 || choice < 1 || choice > 9) {
                printf("无效选项！\n");
                return;
            }
            getchar(); // 清空输入缓冲区

            // 5. 根据选择修改特定字段
            switch (choice) {
                case 1: // 修改学号
                    printf("请输入新学号：");
                    scanf("%19s", p->info.id);
                    break;
                case 2: // 修改姓名
                    printf("请输入新姓名：");
                    scanf("%19s", p->info.name);
                    break;
                case 3: // 修改班级
                    printf("请输入新班级：");
                    scanf("%19s", p->info.class);
                    break;
                case 4: // 修改第1科成绩
                    printf("请输入新成绩（当前：%.2lf）：", p->info.score[0]);
                    scanf("%lf", &p->info.score[0]);
                    break;
                case 5: // 修改第2科成绩
                    printf("请输入新成绩（当前：%.2lf）：", p->info.score[1]);
                    scanf("%lf", &p->info.score[0]);
                    break;
                case 6: // 修改第3科成绩
                    printf("请输入新成绩（当前：%.2lf）：", p->info.score[2]);
                    scanf("%lf", &p->info.score[0]);
                    break;
                case 7: // 修改第4科成绩
                    printf("请输入新成绩（当前：%.2lf）：", p->info.score[3]);
                    scanf("%lf", &p->info.score[0]);
                    break;
                case 8: // 修改第5科成绩
                    printf("请输入新成绩（当前：%.2lf）：", p->info.score[4]);
                    scanf("%lf", &p->info.score[0]);
                    break;
                case 9: // 修改第6科成绩
                    printf("请输入新成绩（当前：%.2lf）：", p->info.score[5]);
                    scanf("%lf", &p->info.score[0]);
                    break;    
                default: // 修改其他科目成绩
                    break;
            }
            getchar(); // 清空输入缓冲区

            // 6. 保存到文件
            write_file(head);
            printf("修改成功！\n");
            return;
        }
        p = p->next;
    }
    printf("未找到学生：%s\n", find_name);
}



// 排序学生信息
// void sort_students(Pnode_list head) 
// {
//     if (!head->next || !head->next->next) return;
    
//     int choice;
//     int swapped;
//     Pnode_list ptr1;
//     Pnode_list lptr = head;
//     while (ptr1->next != lptr)
//     {
//     printf("\n请选择要排序的方式：\n");
//     printf("1. 按学号排序\n2. 按第1科成绩\n3. 按第2科成绩\n4. 按第3科成绩\n5. 按第4科成绩\n6. 按第5科成绩\n7. 按第6科成绩\n8.退出(不排序)\n");
//     printf("输入选项（1-8）：");
//     int choice;
//     if (scanf("%d", &choice) != 1 || choice < 1 || choice > 8) 
//     {
//         printf("无效选项！\n");
//         return;
//     }
//     getchar(); // 清空输入缓冲区
//     //  根据选择修改特定字段
//     switch (choice) 
//     {
//         case 1: // 按学号排序
//         do {
//             swapped = 0;
//             ptr1 = head->next;
            
//             while (ptr1->next != lptr) {
//                 if (strcmp(ptr1->info.id, ptr1->next->info.id) > 0)
//                 {
//                     Data_type temp = ptr1->info;
//                     ptr1->info = ptr1->next->info;
//                     ptr1->next->info = temp;
//                     swapped = 1;
//                 }
//                 ptr1 = ptr1->next;
//             }
//             lptr = ptr1;
//             } while (swapped);
//             break;
//         case 2: // 按第1科成绩排序
//             do {
//                 swapped = 0;
//                 ptr1 = head->next;           
//                 while (ptr1->next != lptr)
//                 {
//                     if (ptr1->info.score[0] < ptr1->next->info.score[0]) 
//                     {
//                         Data_type temp = ptr1->info;
//                         ptr1->info = ptr1->next->info;
//                         ptr1->next->info = temp;
//                         swapped = 1;
//                     }
//                     ptr1 = ptr1->next;
//                 }
//                 lptr = ptr1;
//                 } while (swapped);
//                 break;
//         case 3: // 按第2科成绩排序
//             do {
//                 swapped = 0;
//                 ptr1 = head->next;           
//                 while (ptr1->next != lptr)
//                 {
//                     if (ptr1->info.score[1] < ptr1->next->info.score[1]) 
//                     {
//                         Data_type temp = ptr1->info;
//                         ptr1->info = ptr1->next->info;
//                         ptr1->next->info = temp;
//                         swapped = 1;
//                     }
//                     ptr1 = ptr1->next;
//                 }
//                 lptr = ptr1;
//                 } while (swapped);
//                 break;
//         case 4: // 按第3科成绩排序
//             do {
//                 swapped = 0;
//                 ptr1 = head->next;           
//                 while (ptr1->next != lptr)
//                 {
//                     if (ptr1->info.score[2] < ptr1->next->info.score[2]) 
//                     {
//                         Data_type temp = ptr1->info;
//                         ptr1->info = ptr1->next->info;
//                         ptr1->next->info = temp;
//                         swapped = 1;
//                     }
//                     ptr1 = ptr1->next;
//                 }
//                 lptr = ptr1;
//                 } while (swapped);
//                 break;
//         case 5: // 按第4科成绩排序
//             do {
//                 swapped = 0;
//                 ptr1 = head->next;           
//                 while (ptr1->next != lptr)
//                 {
//                     if (ptr1->info.score[3] < ptr1->next->info.score[3]) 
//                     {
//                         Data_type temp = ptr1->info;
//                         ptr1->info = ptr1->next->info;
//                         ptr1->next->info = temp;
//                         swapped = 1;
//                     }
//                     ptr1 = ptr1->next;
//                 }
//                 lptr = ptr1;
//                 } while (swapped);
//                 break;
//         case 6: // 按第5科成绩排序
//             do {
//                 swapped = 0;
//                 ptr1 = head->next;           
//                 while (ptr1->next != lptr)
//                 {
//                     if (ptr1->info.score[4] < ptr1->next->info.score[4]) 
//                     {
//                         Data_type temp = ptr1->info;
//                         ptr1->info = ptr1->next->info;
//                         ptr1->next->info = temp;
//                         swapped = 1;
//                     }
//                     ptr1 = ptr1->next;
//                 }
//                 lptr = ptr1;
//                 } while (swapped);
//                 break;
//         case 7: // 按第6科成绩排序
//             do {
//                 swapped = 0;
//                 ptr1 = head->next;           
//                 while (ptr1->next != lptr)
//                 {
//                     if (ptr1->info.score[5] < ptr1->next->info.score[5]) 
//                     {
//                         Data_type temp = ptr1->info;
//                         ptr1->info = ptr1->next->info;
//                         ptr1->next->info = temp;
//                         swapped = 1;
//                     }
//                     ptr1 = ptr1->next;
//                 }
//                 lptr = ptr1;
//                 } while (swapped);
//                 break;
//             case 8:
//                 return;
//                 break;
//         default: 
//             break;
            
//     }
//     }
    
//     printf("学生信息已排序！\n");
// }
// 学生信息排序（学号排序）

void sort_students(Pnode_list head) {
    // read_file_stu(head);
    if (head->next == head || head->next->next == head) {
        printf("学生信息不足，无需排序！\n");
        return ;
    }
    
    // 冒泡排序
    int swapped;
    Pnode_list ptr1,node;
    Pnode_list lptr = head;
    
    do {
        swapped = 0;
        ptr1 = head->next;
        
        while (ptr1->next != lptr) {
            node=ptr1->next;
            // 按学号排序
            
            if (strcmp(ptr1->info.id, node->info.id) > 0) {
                // 交换节点数据
                //printf("ppp\n");
                Data_type temp = ptr1->info;
                ptr1->info =node->info;
                node->info = temp;
                swapped = 1;
                
            }
            
            ptr1 = ptr1->next;
            
        }
        
        lptr = ptr1;
    } while (swapped);
    
    printf("学生信息已按学号排序！\n");
    return ;
}